#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
自动打包脚本
运行此脚本将程序打包成exe文件
"""

import os
import sys
import subprocess

def check_pyinstaller():
    """检查PyInstaller是否已安装"""
    try:
        import PyInstaller
        print("✓ PyInstaller 已安装")
        return True
    except ImportError:
        print("❌ PyInstaller 未安装")
        return False

def install_pyinstaller():
    """安装PyInstaller"""
    print("正在安装 PyInstaller...")
    try:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller", 
                              "-i", "https://pypi.tuna.tsinghua.edu.cn/simple/"])
        print("✓ PyInstaller 安装成功")
        return True
    except subprocess.CalledProcessError:
        print("❌ PyInstaller 安装失败")
        return False

def build_exe():
    """构建exe文件"""
    print("开始打包程序...")
    
    # PyInstaller 命令参数
    cmd = [
        "pyinstaller",
        "--onefile",                    # 打包成单个exe文件
        "--windowed",                   # 隐藏控制台窗口  
        "--name=英语单词训练系统",         # 设置exe文件名
        "--icon=icon.ico",              # 图标文件（如果有的话）
        "--add-data=cet-4_json;cet-4_json",  # 包含数据文件夹
        "--add-data=training_data;training_data",  # 包含训练数据文件夹（如果存在）
        "--hidden-import=matplotlib.backends.backend_tkagg",  # 添加隐藏导入
        "--hidden-import=PIL._tkinter_finder",
        "--distpath=.",                 # 输出到当前目录而不是dist文件夹
        "--workpath=build",             # 临时文件目录
        "--clean",                      # 清理之前的构建文件
        "main.py"                       # 主程序文件
    ]
    
    try:
        # 如果没有图标文件，移除图标参数
        if not os.path.exists("icon.ico"):
            cmd = [arg for arg in cmd if not arg.startswith("--icon")]
        
        # 如果training_data文件夹不存在，移除该参数
        if not os.path.exists("training_data"):
            cmd = [arg for arg in cmd if not arg.startswith("--add-data=training_data")]
        
        subprocess.check_call(cmd)
        print("\n🎉 打包成功！")
        print("exe文件位置: 英语单词训练系统.exe (项目根目录)")
        print("💡 重要提示：exe文件已放置在项目根目录，可以直接访问所有数据文件")
        
    except subprocess.CalledProcessError as e:
        print(f"❌ 打包失败: {e}")
        return False
    
    return True

def main():
    print("=" * 50)
    print("     英语单词训练系统 - 打包工具")
    print("=" * 50)
    
    # 检查当前目录
    if not os.path.exists("main.py"):
        print("❌ 错误：请在项目根目录运行此脚本")
        input("按回车键退出...")
        return
    
    if not os.path.exists("cet-4_json"):
        print("❌ 错误：未找到 cet-4_json 文件夹")
        input("按回车键退出...")
        return
    
    # 检查并安装PyInstaller
    if not check_pyinstaller():
        if not install_pyinstaller():
            input("按回车键退出...")
            return
    
    # 开始打包
    if build_exe():
        print("\n📋 使用说明：")
        print("1. exe文件已生成在项目根目录")
        print("2. exe文件可以直接运行，自动读取同目录下的数据文件")
        print("3. 第一次运行可能需要一些时间")
        print("4. 分发时请将exe文件和cet-4_json文件夹一起打包")
        print("5. 用户数据将自动保存在exe文件同目录下")
    
    input("\n按回车键退出...")

if __name__ == "__main__":
    main() 